// hello/utils/jwt_utils.go
package utils

import (
	"errors"
	"fmt"
	"time"

	"github.com/dgrijalva/jwt-go"
)

// SecretKey 用于签名和验证JWT的密钥
var SecretKey = []byte("your_secret_key")

// GenerateToken 生成JWT
func GenerateToken(userID string) (string, error) {
	// 创建一个新的令牌对象，指定签名方法为HS256
	token := jwt.New(jwt.SigningMethodHS256)

	// 设置令牌的声明
	claims := token.Claims.(jwt.MapClaims)
	claims["user_id"] = userID
	claims["exp"] = time.Now().Add(time.Hour * 24).Unix() // 令牌有效期为24小时

	// 使用密钥对令牌进行签名
	tokenString, err := token.SignedString(SecretKey)
	if err != nil {
		return "", fmt.Errorf("failed to generate token: %w", err)
	}

	return tokenString, nil
}

// ValidateToken 验证JWT
func ValidateToken(tokenString string) (string, error) {
	// 解析令牌
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		// 验证签名方法
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
		}
		return SecretKey, nil
	})

	if err != nil {
		return "", fmt.Errorf("failed to parse token: %w", err)
	}

	// 检查令牌是否有效
	if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
		userID, ok := claims["user_id"].(string)
		if !ok {
			return "", errors.New("invalid user ID in token")
		}
		return userID, nil
	}

	return "", errors.New("invalid token")
}
